package net.suplementos.web.action;

import java.util.List;

import net.suplementos.exception.NegocioException;
import net.suplementos.negocio.CadastroDelegate;
import net.suplementos.pojo.Categoria;
import net.suplementos.pojo.Marca;
import net.suplementos.pojo.Produto;
import net.suplementos.servico.CadastroServico;
import net.suplementos.web.LocalConstantes;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ExceptionMapping;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/manterProduto")
@InterceptorRefs({
	@InterceptorRef(value = "store", params = {"operationMode", "AUTOMATIC"}),
	@InterceptorRef("defaultStack")
})
public class ManterProdutoAction extends ActionSupport {
	
	private Produto produto;
	private List<Produto> resultadoConsulta;
	
	private List<Categoria> categorias;
	private List<Marca> marcas;
	
	private CadastroServico cadastroServico = CadastroDelegate.getInstance();

	private static final String NOME_ENTIDADE_SINGULAR = "Produto";
	
	private static final String NOME_ENTIDADE_PLURAL = "Produtos";

	@Action(value = "abrirConsultar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/consultar.jsp"),
		@Result(name = INPUT, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/consultar.jsp")
	})
    public String abrirConsultar() throws Exception {
		setCategorias(cadastroServico.listarTodasCategoriasAtivas());
		setMarcas(cadastroServico.listarTodasMarcasAtivas());
        return SUCCESS;
    }

	@Action(value = "consultar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/listar.jsp") ,
		@Result(name = INPUT, params = {"actionName", "abrirConsultar"}, type = "redirectAction")
	}, exceptionMappings = {
		@ExceptionMapping(exception = "net.suplementos.exception.NegocioException", result = INPUT)
	})
	public String consultar() throws Exception {
		setResultadoConsulta(cadastroServico.consultar(getProduto()));

		if (getResultadoConsulta() == null || getResultadoConsulta().isEmpty()) {
			throw new NegocioException("sdfsdf");
		}
		return SUCCESS;
	}

	@Action(value = "abrirIncluir", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/incluir.jsp")
	})
	public String abrirIncluir() throws Exception {
		setCategorias(cadastroServico.listarTodasCategoriasAtivas());
		setMarcas(cadastroServico.listarTodasMarcasAtivas());
		return SUCCESS;
	}

	@Action(value = "confirmarInclusao", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/confirmarInclusao.jsp") 
	})
	public String confirmarInclusao() throws Exception {
		setCategorias(cadastroServico.listarTodasCategoriasAtivas());
		setMarcas(cadastroServico.listarTodasMarcasAtivas());
		return SUCCESS;
	}
	
	@Action(value = "incluir", results = {
		@Result(name = SUCCESS, params = {"actionName", "abrirConsultar"}, type = "redirectAction"),
		@Result(name = INPUT, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/incluir.jsp")
	}, exceptionMappings = {
		@ExceptionMapping(exception = "net.suplementos.exception.NegocioException", result = INPUT)
	})
	public String incluir() throws Exception {
		cadastroServico.salvar(getProduto());
		addActionMessage(getText("geral.mensagem.incluir", new String[]{NOME_ENTIDADE_SINGULAR}));
		return SUCCESS;
	}

	@Action(value = "abrirAlterar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/alterar.jsp"),
		@Result(name = INPUT, params = {"actionName", "consultar"}, type = "redirectAction")
	})
	public String abrirAlterar() throws Exception {
		Produto protdutoBD = cadastroServico.getProduto(produto.getId());
		if (protdutoBD == null) {
			addActionError(getText("geral.mensagem.get", new String[]{NOME_ENTIDADE_SINGULAR}));
			return INPUT;
		}
		setProduto(protdutoBD);
		return SUCCESS;
	}

	@Action(value = "confirmarAlteracao", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/confirmarAlteracao.jsp") 
	})
	public String confirmarAlteracao() throws Exception {
		return SUCCESS;
	}
	
	@Action(value = "alterar", results = {
		@Result(name = SUCCESS, params = {"actionName", "consultar"}, type = "redirectAction") 
	})
	public String alterar() throws Exception {
		addActionMessage(getText("geral.mensagem.alterar", new String[]{NOME_ENTIDADE_SINGULAR}));
		cadastroServico.alterar(getProduto());
		return SUCCESS;
	}

	/*
	@Action(value = "confirmarExclusao", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/confirmarExclusao.jsp") 
	})
	public String confirmarExclusao() throws Exception {
		return SUCCESS;
	}
	
	@Action(value = "excluir", results = {
		@Result(name = SUCCESS, params = {"actionName", "consultar"}, type = "redirectAction") 
	})
	public String excluir() throws Exception {
		addActionMessage(getText("geral.mensagem.excluir", new String[]{NOME_ENTIDADE_SINGULAR}));
		return SUCCESS;
	}
	*/
	
	@Action(value = "detalhar", results = {
		@Result(name = SUCCESS, location = LocalConstantes.LOCAL_JSP_CADASTRO_PRODUTO + "/detalhar.jsp") 
	})
	public String detalhar() throws Exception {
		cadastroServico.getProduto(getProduto().getId());
		return SUCCESS;
	}
	
	public String getNomeEntidadeSingular() {
		return NOME_ENTIDADE_SINGULAR;
	}
	
	public String getNomeEntidadePlural() {
		return NOME_ENTIDADE_PLURAL;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public List<Produto> getResultadoConsulta() {
		return resultadoConsulta;
	}

	public void setResultadoConsulta(List<Produto> resultadoConsulta) {
		this.resultadoConsulta = resultadoConsulta;
	}

	public CadastroServico getCadastroServico() {
		return cadastroServico;
	}

	public void setCadastroServico(CadastroServico cadastroServico) {
		this.cadastroServico = cadastroServico;
	}

	public List<Categoria> getCategorias() {
		return categorias;
	}

	public void setCategorias(List<Categoria> categorias) {
		this.categorias = categorias;
	}

	public List<Marca> getMarcas() {
		return marcas;
	}

	public void setMarcas(List<Marca> marcas) {
		this.marcas = marcas;
	}
}